// 生产环境的插件electron
import type { Plugin } from 'vite'
import fs from 'node:fs'
import * as electronBuilder from 'electron-builder'
import path from 'path'

// 同步构建 electron 文件
// 将 electron入口文件 .ts 同步打包成 .js
const buildBackgroud = () => {
    require('esbuild').buildSync({
        entryPoints: ['electron/index.ts'],
        bundle: true,
        outfile: 'dist/electron/index.js',
        platform: 'node',
        target: 'node12',
        external: ['electron']
    })
}

// 打包：需要先等vite打包之后就有了index.html，再执行electron-builder打包
export const ElectronBuildPlugin = (): Plugin => {
    return {
        name: 'electron-build',
        // 使用vite独有的钩子：目的是在vite打包之后，执行electron-builder打包
        closeBundle() {
            buildBackgroud()
            // 'electron-builder'需要将'package.json'的'main'属性 指向 electron 入口文件
            const pk_json = JSON.parse(fs.readFileSync('package.json', 'utf-8'))
            pk_json.main = 'electron/index.js'
            // 写入'dist'打包目录中
            fs.writeFileSync('dist/package.json', JSON.stringify(pk_json, null, 4))
            // 解决'electron-builder'的BUG：会下载垃圾文件
            // 方案：创建一个假的node_modules目录
            fs.mkdirSync('dist/node_modules')
            // 打包操作
            electronBuilder.build({
                config: {
                    directories: {
                        output: path.resolve(process.cwd(), 'release'), // 输出文件：在根目录的release目录中
                        app: path.resolve(process.cwd(), 'dist'), // 打包应用的目录：在根目录的dist目录中
                    },
                    asar: true,  // 打包成压缩包
                    appId: 'com.example.app',
                    productName: 'vite-electron',
                    nsis: {  // 安装时的配置
                        oneClick: false, // 取消一键安装
                        allowToChangeInstallationDirectory: true, // 允许用户选择安装目录
                    }
                }
            })
        }
    }
}
